ShowTable of Contents
概要
XPages でアプリケーションを開発する際、マウスによるクリックやキー入力など、さまざまなイベントに対してアクションを設定することが可能です。
その際、いくつかのオプションが指定可能です。ここではそのうち、ちょっと区別が付きにくいデータ処理に関連するサーバーオプションについて解説します。
以下の3つが指定可能なオプションです。
* データの検証または更新を行わない
* 検証を行わずにデータを処理する
* 部分実行モードの設定
サンプルアプリケーション
これらのオプションを、以下の簡単なサンプルアプリケーションの動きを通して見て行きます。
アプリケーション上部には、2組の「編集ボックス」と「計算結果フィールド」のコントロールのペアが、「パネル」コントロールでグループ化されています。
それぞれのペアは、データとして sessionScope.value1 あるいは sessionScope.value2 にバインドされています。
これにより、「編集ボックス」に入力された値が送信処理されると、「計算結果フィールド」に表示されるという動きをします。
各「編集ボックス」は、妥当性検査として必須フィールドであると指定されています。
アプリケーション下部には、4つのボタンが配置されています。onclick のイベント処理として、「全て更新」が指定されています。
データ処理に関するオプションとしては、それぞれボタン名に書かれたもののみが指定されています。
無指定
もっとも基本的な動作です。
各「編集ボックス」に値を入力せずにクリックすると、データ検証が行われエラーが表示されます。
適当な値を入力した後クリックすると、入力された値が「計算結果フィールド」にも表示されます。
データの検証または更新を行わない
このオプションを指定した場合、「編集ボックス」の入力値のデータ検証が行われず、また入力された値の処理も一切行われません。
そのため、1つめの「編集ボックス」にのみ値を入力してクリックすると、以下のような結果となります。
検証を行わないため、2つめの「編集ボックス」が未入力でも送信処理が行われています。
しかしながらデータ処理も行わないため、1つめの「編集ボックス」に入力された値は「計算結果フィールド」に表示されません。
このオプションは、データ入力フォームを作成した際、「キャンセル」ボタンを実現する時などに用いるものです。
現在入力されている値が正しいかどうかによらず、全て破棄して処理を続行させるためのオプションです。
*Designer の日本語訳が良くないことが、このオプションの意味をわかりにくくしている一因になっています。
正しくは「データの検証も更新も行わない」とするべきでしょう。
検証を行わずにデータ処理をする
このオプションを指定した場合、「編集ボックス」の入力値のデータ検証は行われませんが、入力された値の処理は実行されます。
そのため、1つめの「編集ボックス」にのみ値を入力してクリックすると、以下のような結果となります。
検証を行わないため、2つめの「編集ボックス」が未入力でも送信処理が行われています。
データ処理は行われるため、1つめの「編集ボックス」に入力された値が「計算結果フィールド」に表示されます。
このオプションは、「データの検証または更新を行わない」オプションとと排他的に指定可能です。
部分実行モードの設定
このオプションは、データ処理を行う際にページ全体ではなく指定した一部のみ実行することを指定します。
わかりにくいので、サンプルの実行を通して確認します。
このサンプルでは、実行するページの一部として、1つめのペアをクループ化している「パネル」をあらかじめ指定してあります。
最初に、両「編集ボックス」に値を入力して、「無指定」ボタンをクリックして処理を行っておきます。
結果は以下の通りです。
次に、入力値をそれぞれ"xxx"と"yyy"に変更して、「部分実行モードの設定」ボタンをクリックします。
実行結果は以下のようになります。
1つめのペアは部分実行すべき部分として指定されてたため、再入力された新しい値が表示されています。
しかしながら2つめのペアは処理が実行されなかったため、再入力された新しい値は無視され、最初の値に戻ってしまっています。
このオプションは何のためのものでしょうか?実は XPages はその基本構造として JSF (Java Server Faces) を利用しています。
そのフレームワーク内では、各コントロールに対してそれぞれ Java のクラスが生成され、そのクラスにより入力値の受け取りや
妥当性検査、データ処理が行われるようになっています。
その結果、コントロールをたくさん含むページほど、生成される Java のクラスも多くなり、その結果
消費されるリソースや処理時間が増大します。
そのため、ある処理を行う際、影響が及ぶ範囲がページの一部に限られていることがあらかじめわかっている場合には、
このオプションを用いてその部分だけ部分実行するように指定することにより、全体の処理を軽くすることが可能になります。
部分実行する対象要素を指定するには、「アウトライン」ペインで対象となる「イベントハンドラ」を選択し、「すべてのプロパティ」の
「execId」 属性として対象要素の ID を指定します。
指定がない場合には、その「イベントハンドラ」が定義されたコントロールそのものになります。
このオプションは、先の2つのオプションとは独立して、自由に設定することができます。
サンプルアプリケーションコード
最後に、今回利用しているサンプルアプリケーションのソースコードを添えておきます。Designer 上で新規の XPage を作成し、
ソースモードでコピーすることで試してみることができます。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:panel id="panel1">
<xp:inputText id="inputText1" value="#{sessionScope.value1}" required="true">
<xp:this.validators>
<xp:validateRequired message="必ず入力してください。"></xp:validateRequired>
</xp:this.validators></xp:inputText>
=
<xp:text escape="true" id="computedField1" value="#{sessionScope.value1}"></xp:text>
</xp:panel>
<xp:br></xp:br>
<xp:panel id="panel2">
<xp:inputText id="inputText2" value="#{sessionScope.value2}" required="true">
<xp:this.validators>
<xp:validateRequired message="必ず入力してください。"></xp:validateRequired>
</xp:this.validators></xp:inputText>
=
<xp:text escape="true" id="computedField2" value="#{sessionScope.value2}"></xp:text>
</xp:panel>
<xp:br></xp:br>
<xp:button id="button1" value="無指定">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
</xp:eventHandler></xp:button>
<xp:br></xp:br><xp:br></xp:br>
<xp:button value="データの検証または更新を行わない" id="button2">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="true">
</xp:eventHandler></xp:button>
<xp:br></xp:br><xp:br></xp:br>
<xp:button value="検証を行わずにデータを処理する" id="button3">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" disableValidators="true">
</xp:eventHandler></xp:button>
<xp:br></xp:br><xp:br></xp:br>
<xp:button value="部分実行モードの設定" id="button4">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" execMode="partial" execId="panel1">
</xp:eventHandler></xp:button>
</xp:view>